#ifndef ENVIRONMENT_H
#define ENVIRONMENT_H

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include "lexeme.h"

struct exit_exception2 { 
   int m_code;
   const char* m_expected;
   exit_exception2(int code, const char* expected)
     :m_code(code), m_expected(expected)
   {
     printf("ILLEGAL %d\nCould not locate %s",
       m_code, m_expected);
     exit(m_code);
   } 
};

class Environment
{
public:
  Environment(){m_root = NULL;}
  ~Environment();

public:
  Lexeme* m_root;
  Lexeme* cons(Lexeme* a, Lexeme* b);
  Lexeme* car(Lexeme*);
  Lexeme* cdr(Lexeme*);
  Lexeme* cadr(Lexeme*);
  Lexeme* caddr(Lexeme*);
  Lexeme* cadddr(Lexeme*);
  Lexeme* newEnvironment();
  Lexeme* populate(Lexeme* var, Lexeme* val, Lexeme* env);
  Lexeme* lookup(Lexeme* var, Lexeme* env);
  Lexeme* extend(Lexeme* vars, Lexeme* vals, Lexeme* env);
  Lexeme* update(Lexeme* var, Lexeme* val, Lexeme* env);
  bool matchVar(Lexeme*,Lexeme*);
  void print(Lexeme* root, int level);
  void deleteEnvironment(Lexeme* root, int level);
};

#endif